/* 引入axios */
import axios from 'axios'
/* 引入进度条 */
import NProgress from 'nprogress'
/* 引入getToken函数用于获取cookie中的token字段 */
import {getToken} from '@/utils/auth'
import store from '@/store'
import router from '@/router'
import {Message} from 'element-ui'

/* 创建一个axios的实例，并且配置baseURL和timeout */
const request = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000
})

/*添加请求拦截器(发送请求时执行)*/
request.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // 开启进度条
  NProgress.start()
  // 请求发送之前判断cookie中是否有token令牌如果有token则在请求头上携带token发送请求
  const token = getToken()
  if (token) config.headers.Authorization = `Bearer ${token}`
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

/*添加响应拦截器(响应结果时执行)*/
request.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。对响应数据做点什么
  // 关闭进度条
  NProgress.done()
  // 如果本次的响应数据data.success为false则认为本次请求为失败，返回一个失败的Promise对象
  if (!response.data.success) return Promise.reject(new Error(response.data.message))
  // 响应成功进行数据脱壳
  return response.data
}, async function (error) {
  // 超出 2xx 范围的状态码都会触发该函数。对响应错误做点什么
  // 关闭进度条
  NProgress.done()
  // 处理token过期
  if (error.response && error.response.status === 401) {
    await store.dispatch('user/logoutAction')
    const redirect = location.hash.substring(1)
    router.push({path: '/login', query: {redirect}})
    Message.warning('重新登录')
  }
  return Promise.reject(error)
})

export default request
